namespace Digitalmes.Domain.Entities.Mes.Reworks;

/// <summary>
/// 产品返工单。
/// </summary>
[SugarTable("rework_doc")]
public sealed class ReworkDoc : EntityBase
{
    /// <summary>
    /// 零件码
    /// </summary>
    [NotNull]
    public string? Sn { get; set; }

    /// <summary>
    /// 产品 Id。
    /// </summary>
    public long ProductId { get; set; }

    /// <summary>
    /// 产品编码
    /// </summary>
    public string? ProductCode { get; set; }

    /// <summary>
    /// 关联原生产工单
    /// </summary>
    public string? Wo { get; set; }

    /// <summary>
    /// 返工模式（在线/离线）
    /// </summary>
    public ReworkModeEnum ReworkMode { get; set; }

    /// <summary>
    /// 返工产线 Id
    /// </summary>
    public long LineId { get; set; }

    /// <summary>
    /// 产品NG的工序 Id。
    /// </summary>
    public long NgOperationId { get; set; }

    /// <summary>
    /// 产品NG的工序编号。
    /// </summary>
    [NotNull]
    public string? NgOperationCode { get; set; }

    /// <summary>
    /// 产品NG的工位 Id。
    /// </summary>
    public long NgWorkstationId { get; set; }

    /// <summary>
    /// 产品NG的工位编号。
    /// </summary>
    [NotNull]
    public string? NgWorkstationCode { get; set; }

    /// <summary>
    /// 返工后需重新进入的工序 Id（为 0 表示产品不需要再上线）。
    /// </summary>
    /// <remarks>
    /// 在线返工为要返工的工序，离线返工为返工后再上线的工序。
    /// 在产品报废或是返工后不需要再次上线时，该字段为 0。
    /// </remarks>
    public long TargetOperationId { get; set; }

    /// <summary>
    /// 返工后需重新进入的工序编号（未设定时为空）。
    /// </summary>
    public string? TargetOperationCode { get; set; }

    /// <summary>
    /// 返工状态（1->待返工；2->返工中；3->返工完成；9->取消）
    /// </summary>
    public ReworkStatusEnum Status { get; set; }

    /// <summary>
    /// 返工结果（1->合格；2->不合格；3->报废）
    /// </summary>
    public ReworkResultEnum Result { get; set; }

    /// <summary>
    /// 操作人员。
    /// </summary>
    public string? Operator { get; set; }

    /// <summary>
    /// 备注。
    /// </summary>
    public string? Remark { get; set; }

    /// <summary>
    /// 返工开始时间。
    /// </summary>
    public DateTime? StartTime { get; set; }

    /// <summary>
    /// 返工完成时间。
    /// </summary>
    public DateTime? EndTime { get; set; }

    /// <summary>
    /// 返工缺陷集合。
    /// </summary>
    [Navigate(NavigateType.OneToMany, nameof(ReworkDefect.ReworkId))]
    public List<ReworkDefect>? Defects { get; set; }

    /// <summary>
    /// 返工过程。
    /// </summary>
    [Navigate(NavigateType.OneToMany, nameof(ReworkDetail.ReworkId))]
    public List<ReworkDetail>? Details { get; set; }
}
